home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / ConfiguredUniverse / ConfigObjLoad.java.z / ConfigObjLoad.java
Encoding:
Java Source  |  2003-08-08  |  10.0 KB  |  305 lines

  1. /*
  2.  *    @(#)ConfigObjLoad.java 1.3 02/04/01 15:04:14
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import com.sun.j3d.loaders.objectfile.ObjectFile;
  41. import com.sun.j3d.loaders.ParsingErrorException;
  42. import com.sun.j3d.loaders.IncorrectFormatException;
  43. import com.sun.j3d.loaders.Scene;
  44. import java.awt.*;
  45. import java.awt.event.*;
  46. import com.sun.j3d.utils.applet.MainFrame;
  47. import com.sun.j3d.utils.universe.*;
  48. import javax.media.j3d.*;
  49. import javax.vecmath.*;
  50. import java.io.*;
  51. import com.sun.j3d.utils.behaviors.vp.*;
  52. import com.sun.j3d.utils.behaviors.sensor.Mouse6DPointerBehavior;
  53. import java.net.URL;
  54. import java.net.MalformedURLException;
  55. import java.util.Map;
  56.  
  57. public class ConfigObjLoad {
  58.  
  59.     private boolean spin = false;
  60.     private boolean noTriangulate = false;
  61.     private boolean noStripify = false;
  62.     private double creaseAngle = 60.0;
  63.     private URL filename = null;
  64.  
  65.     private ConfiguredUniverse u;
  66.  
  67.     public BranchGroup createSceneGraph() {
  68.     // Create the root of the branch graph
  69.     BranchGroup objRoot = new BranchGroup();
  70.  
  71.         // Create a Transformgroup to scale all objects so they
  72.         // appear in the scene.
  73.         TransformGroup objScale = new TransformGroup();
  74.         Transform3D t3d = new Transform3D();
  75.         t3d.setScale(0.7);
  76.         objScale.setTransform(t3d);
  77.         objRoot.addChild(objScale);
  78.  
  79.     // Create the transform group node and initialize it to the
  80.     // identity.  Enable the TRANSFORM_WRITE capability so that
  81.     // our behavior code can modify it at runtime.  Add it to the
  82.     // root of the subgraph.
  83.     TransformGroup objTrans = new TransformGroup();
  84.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  85.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  86.     objScale.addChild(objTrans);
  87.  
  88.     int flags = ObjectFile.RESIZE;
  89.     if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
  90.     if (!noStripify) flags |= ObjectFile.STRIPIFY;
  91.     ObjectFile f = new ObjectFile(flags, 
  92.       (float)(creaseAngle * Math.PI / 180.0));
  93.     Scene s = null;
  94.     try {
  95.       s = f.load(filename);
  96.     }
  97.     catch (FileNotFoundException e) {
  98.       System.err.println(e);
  99.       System.exit(1);
  100.     }
  101.     catch (ParsingErrorException e) {
  102.       System.err.println(e);
  103.       System.exit(1);
  104.     }
  105.     catch (IncorrectFormatException e) {
  106.       System.err.println(e);
  107.       System.exit(1);
  108.     }
  109.       
  110.     objTrans.addChild(s.getSceneGroup());
  111.  
  112.     BoundingSphere bounds =
  113.       new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  114.  
  115.         if (spin) {
  116.       Transform3D yAxis = new Transform3D();
  117.       Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  118.                       0, 0,
  119.                       4000, 0, 0,
  120.                       0, 0, 0);
  121.  
  122.       RotationInterpolator rotator =
  123.           new RotationInterpolator(rotationAlpha, objTrans, yAxis,
  124.                        0.0f, (float) Math.PI*2.0f);
  125.       rotator.setSchedulingBounds(bounds);
  126.       objTrans.addChild(rotator);
  127.     } 
  128.  
  129.         // Set up the background
  130.         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
  131.         Background bgNode = new Background(bgColor);
  132.         bgNode.setApplicationBounds(bounds);
  133.         objRoot.addChild(bgNode);
  134.  
  135.         // Set up the ambient light
  136.         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
  137.         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  138.         ambientLightNode.setInfluencingBounds(bounds);
  139.         objRoot.addChild(ambientLightNode);
  140.  
  141.         // Set up the directional lights
  142.         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
  143.         Vector3f light1Direction  = new Vector3f(1.0f, 1.0f, 1.0f);
  144.         Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
  145.         Vector3f light2Direction  = new Vector3f(-1.0f, -1.0f, -1.0f);
  146.  
  147.         DirectionalLight light1
  148.             = new DirectionalLight(light1Color, light1Direction);
  149.         light1.setInfluencingBounds(bounds);
  150.         objRoot.addChild(light1);
  151.  
  152.         DirectionalLight light2
  153.             = new DirectionalLight(light2Color, light2Direction);
  154.         light2.setInfluencingBounds(bounds);
  155.         objRoot.addChild(light2);
  156.  
  157.     return objRoot;
  158.     }
  159.  
  160.     private void usage()
  161.     {
  162.       System.out.println(
  163.     "Usage: java ObjLoad [-s] [-n] [-t] [-c degrees] <.obj file>");
  164.       System.out.println("  -s Spin (no user interaction)");
  165.       System.out.println("  -n No triangulation");
  166.       System.out.println("  -t No stripification");
  167.       System.out.println(
  168.     "  -c Set crease angle for normal generation (default is 60 without");
  169.       System.out.println(
  170.     "     smoothing group info, otherwise 180 within smoothing groups)");
  171.       System.exit(0);
  172.     } // End of usage
  173.  
  174.  
  175.     public void init() {
  176.     if (filename == null) {
  177.             try {
  178.               filename = new URL("file:../geometry/galleon.obj");
  179.             }
  180.             catch (MalformedURLException e) {
  181.           System.err.println(e);
  182.           System.exit(1);
  183.             }
  184.     }
  185.  
  186.     // Get the config file URL from the j3d.configURL property or use the
  187.     // default config file "j3d1x1-window" in the current directory.
  188.     URL configURL = ConfiguredUniverse.getConfigURL("file:j3d1x1-window");
  189.  
  190.     // Create a simple scene and attach it to the virtual universe
  191.     BranchGroup scene = createSceneGraph();
  192.     u = new ConfiguredUniverse(configURL);
  193.     
  194.     // Get the ViewingPlatform.
  195.     ViewingPlatform viewingPlatform = u.getViewingPlatform();
  196.  
  197.     // This will move the ViewPlatform back a bit so the objects in the
  198.     // scene can be viewed.  This will only have an effect if the config
  199.     // file sets the window eyepoint policy to something other than
  200.     // RELATIVE_TO_COEXISTENCE, which is the default eyepoint policy
  201.     // applied by ConfiguredUniverse.
  202.     // 
  203.     // The default view attach policy for ConfiguredUniverse applications
  204.     // is NOMINAL_SCREEN.  This sets the view platform origin in the
  205.     // physical world to the center of coexistence, which allows eye
  206.     // positions expressed relative to coexistence to see the appropriate
  207.     // field of view automatically.
  208.         viewingPlatform.setNominalViewingTransform();
  209.     
  210.     // Add a ViewPlatformBehavior if not specified in the config file.
  211.     if (!spin && viewingPlatform.getViewPlatformBehavior() == null) {
  212.             OrbitBehavior orbit = new OrbitBehavior(u.getCanvas(),
  213.                             OrbitBehavior.REVERSE_ALL);
  214.             BoundingSphere bounds =
  215.                 new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
  216.  
  217.             orbit.setSchedulingBounds(bounds);
  218.             viewingPlatform.setViewPlatformBehavior(orbit);        
  219.     }
  220.     
  221.     // See if there's a 6 degree of freedom mouse in the environment.
  222.     // We look for one named "mouse6d".
  223.     Map sensorMap = null;
  224.     sensorMap = u.getNamedSensors();
  225.     if (sensorMap != null) {
  226.         Sensor mouse6d = (Sensor)sensorMap.get("mouse6d");
  227.         if (mouse6d != null) {
  228.         Mouse6DPointerBehavior behavior =
  229.             new Mouse6DPointerBehavior(mouse6d, 1.0, true);
  230.  
  231.         BoundingSphere bounds =
  232.             new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  233.         behavior.setSchedulingBounds(bounds);
  234.  
  235.         scene.addChild(behavior);
  236.         scene.addChild(behavior.getEcho());
  237.         }
  238.     }
  239.  
  240.     // Listen for a typed "q", "Q", or "Escape" key on each canvas to
  241.     // allow a convenient exit from full screen configurations.
  242.     Canvas3D[] canvases;
  243.     canvases = u.getViewer().getCanvas3Ds();
  244.  
  245.     class QuitListener extends KeyAdapter {
  246.         public void keyTyped(KeyEvent e) {
  247.         char c = e.getKeyChar();
  248.         if (c == 'q' || c == 'Q' || c == 27)
  249.             System.exit(0);
  250.         }
  251.     }
  252.  
  253.     QuitListener quitListener = new QuitListener();
  254.     for (int i = 0; i < canvases.length; i++)
  255.         canvases[i].addKeyListener(quitListener);
  256.  
  257.     // Make the scenegraph live.
  258.     u.addBranchGraph(scene);
  259.     }
  260.  
  261.     public ConfigObjLoad(String[] args) {
  262.       if (args.length != 0) {
  263.     for (int i = 0; i < args.length; i++) {
  264.       if (args[i].startsWith("-")) {
  265.         if (args[i].equals("-s")) {
  266.           spin = true;
  267.         } else if (args[i].equals("-n")) {
  268.           noTriangulate = true;
  269.         } else if (args[i].equals("-t")) {
  270.           noStripify = true;
  271.         } else if (args[i].equals("-c")) {
  272.           if (i < args.length - 1) {
  273.         creaseAngle = (new Double(args[++i])).doubleValue();
  274.           } else usage();
  275.         } else {
  276.           usage();
  277.         }
  278.       } else {
  279.         try {
  280.           if ((args[i].indexOf("file:") == 0) ||
  281.           (args[i].indexOf("http") == 0)) {
  282.           filename = new URL(args[i]);
  283.           }
  284.           else if (args[i].charAt(0) != '/') {
  285.           filename = new URL("file:./" + args[i]);
  286.           }
  287.           else {
  288.           filename = new URL("file:" + args[i]);
  289.           }
  290.             }
  291.         catch (MalformedURLException e) {
  292.           System.err.println(e);
  293.           System.exit(1);
  294.         }
  295.       }
  296.     }
  297.       }
  298.       init();
  299.     }
  300.  
  301.     public static void main(String[] args) {
  302.       new ConfigObjLoad(args);
  303.     }
  304. }
  305.